/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 * <p>
 * https://www.renren.io
 * <p>
 * 版权所有，侵权必究！
 */

package io.renren.modules.job.utils;

import io.renren.common.utils.SpringContextUtils;
import io.renren.modules.job.entity.ScheduleJobEntity;
import io.renren.modules.job.entity.ScheduleJobLogEntity;
import io.renren.modules.job.service.ScheduleJobLogService;
import org.apache.commons.lang.StringUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.lang.reflect.Method;
import java.util.Date;


/**
 * 定时任务
 *
 * @author Mark sunlightcs@gmail.com
 */
public class ScheduleJob extends QuartzJobBean {
  private Logger logger = LoggerFactory.getLogger(getClass());

  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap()
      .get(ScheduleJobEntity.JOB_PARAM_KEY);

    //获取spring bean
    ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService");

    //数据库保存执行记录
    ScheduleJobLogEntity log = new ScheduleJobLogEntity();
    log.setJobId(scheduleJob.getJobId());
    log.setBeanName(scheduleJob.getBeanName());
    log.setParams(scheduleJob.getParams());
    log.setCreateTime(new Date());

    //任务开始时间
    long startTime = System.currentTimeMillis();

    try {
      //执行任务
      logger.debug("任务准备执行，任务ID：" + scheduleJob.getJobId());

      Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
      Method method = target.getClass().getDeclaredMethod("run", String.class);
      method.invoke(target, scheduleJob.getParams());

      //任务执行总时长
      long times = System.currentTimeMillis() - startTime;
      log.setTimes((int) times);
      //任务状态    0：成功    1：失败
      log.setStatus(0);

      logger.debug("任务执行完毕，任务ID：" + scheduleJob.getJobId() + "  总共耗时：" + times + "毫秒");
    } catch (Exception e) {
      logger.error("任务执行失败，任务ID：" + scheduleJob.getJobId(), e);

      //任务执行总时长
      long times = System.currentTimeMillis() - startTime;
      log.setTimes((int) times);

      //任务状态    0：成功    1：失败
      log.setStatus(1);
      log.setError(StringUtils.substring(e.toString(), 0, 2000));
    } finally {
      scheduleJobLogService.save(log);
    }
  }
}
